package com.billdowney.util.field;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import io.swagger.annotations.ApiModelProperty;

/**
 * @ClassName: FieldDescribeScanUtil
 * @Description: 字段描述扫描工具
 * @author 超级小富翁 - BillDowney
 * @date 2018年1月31日 下午2:45:30
 */
public class FieldDescribeScanUtil {

	/**
	 * @Function: getFieldDescribe
	 * @Description: 获取字段描述
	 * @param t 传入需要获取的实体类
	 * @return 字段对应描述的键值对
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2018年1月31日 下午3:02:30
	 */
	public static <T> Map<String, String> getFieldDescribe(Class<T> t) {
		List<Field> fieldList = new ArrayList<>();
		Class<?> c = t;
		while (c != null) {// 当父类为null的时候说明到达了最上层的父类(Object类).
			fieldList.addAll(Arrays.asList(c.getDeclaredFields()));
			c = c.getSuperclass(); // 得到父类,然后赋给自己
		}
		Map<String, String> map = new HashMap<>();
		for (Field field : fieldList) {
			if (field.isAnnotationPresent(ApiModelProperty.class)) {
				ApiModelProperty f = field.getAnnotation(ApiModelProperty.class);
				map.put(field.getName(), f.value());
			}
		}
		return map;
	}

	/**
	 * @Function: getFieldDescribeNote
	 * @Description: 获取字段描述和备注
	 * @param t 传入需要获取的实体类
	 * @return 字段对应描述和备注的键值对，描述和备注用英文“;”隔开
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2018年1月31日 下午3:05:39
	 */
	public static <T> Map<String, String> getFieldDescribeNote(Class<T> t) {
		List<Field> fieldList = new ArrayList<>();
		Class<?> c = t;
		while (c != null) {// 当父类为null的时候说明到达了最上层的父类(Object类).
			fieldList.addAll(Arrays.asList(c.getDeclaredFields()));
			c = c.getSuperclass(); // 得到父类,然后赋给自己
		}
		Map<String, String> map = new HashMap<>();
		for (Field field : fieldList) {
			if (field.isAnnotationPresent(ApiModelProperty.class)) {
				ApiModelProperty f = field.getAnnotation(ApiModelProperty.class);
				map.put(field.getName(), f.value() + ";" + f.notes());
			}
		}
		return map;
	}

}
